#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

#include "singleton.h"
#include "getHtml.h"

class printer
{
public:
    printer(boost::asio::io_service& io)
        : strand_(io),
        timer1_(io, boost::posix_time::seconds(1)),
        timer2_(io, boost::posix_time::seconds(1)),
        count_(0)
    {
        timer1_.async_wait(strand_.wrap(boost::bind(&printer::readFIFO, this)));
        timer2_.async_wait(strand_.wrap(boost::bind(&printer::writeFIFO, this)));
    }

    ~printer()
    {
        std::cout << "Final count is " << count_ << "\n";
    }

    void readFIFO()
    {
    dhw_UrlPath::instance()->Run();
        if (!dhw_UrlPath::instance()->isEmpty())
        {
            UrlPath  * url =  dhw_UrlPath::instance()->front();
            getHtml * gh = new getHtml;
            gh->setUrl(url);
            gh->doWork();
            delete gh;
        }
 
        
        timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
        timer1_.async_wait(strand_.wrap(boost::bind(&printer::readFIFO, this)));        
    }

    void writeFIFO()
    {
        if (count_ < 10)
        {
            std::cout << "Timer 2: " << count_ << "\n";
            ++count_;

            timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1));
            timer2_.async_wait(strand_.wrap(boost::bind(&printer::writeFIFO, this)));
        }
    }

private:
    boost::asio::strand strand_;
    boost::asio::deadline_timer timer1_;
    boost::asio::deadline_timer timer2_;
    int count_;
};
